gtkwindow: Unset focus grab_widget if it ends up unmapped
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 29 Jan 2018 11:31:53 +0000 (12:31 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 5 Apr 2018 17:26:04 +0000 (19:26 +0200)
This may result on the later emission of crossing events, with one of the
sides being already unmapped/unrealized. The widget being unmapped will
result on repick and emission of a set of crossing events anyway.

gtk/gtkwindow.c

index 4d8b284283faadecd6c0d451a1bd0af08b4a1872..deb8d19927286f26e345d9a2be8da2f297e723d7 100644 (file)
@@ -11292,6 +11292,11 @@ gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
 
       gtk_pointer_focus_ref (focus);
 
+      if (focus->grab_widget &&
+          (focus->grab_widget == widget ||
+           gtk_widget_is_ancestor (focus->grab_widget, widget)))
+        gtk_pointer_focus_set_implicit_grab (focus, NULL);
+
       if (GTK_WIDGET (focus->toplevel) == widget)
         {
           /* Unmapping the toplevel, remove pointer focus */